<?php
class NganluongGateway extends AppModel
{
	// URL chheckout của nganluong.vn
	private $nganluong_url = 'https://www.nganluong.vn/checkout.php';

	public $receiver = "";
	// Mã merchante site 
	private $merchant_site_code = '';	// Biến này được nganluong.vn cung cấp khi bạn đăng ký merchant site

	// Mật khẩu bảo mật
	private $secure_pass= ''; // Biến này được nganluong.vn cung cấp khi bạn đăng ký merchant site
	
 	function __construct() {
 		$PaymentGatewayInfos = $this->getPaymentSettingsCustom(3);
 		foreach ($PaymentGatewayInfos as $PaymentGatewayInfo){
			if($PaymentGatewayInfo['PaymentGatewaySetting']['key'] == 'receiver'){
				$this->receiver = $PaymentGatewayInfo['PaymentGatewaySetting']['live_mode_value'];
			}else if($PaymentGatewayInfo['PaymentGatewaySetting']['key'] == 'merchant_site_code'){
				$this->merchant_site_code = $PaymentGatewayInfo['PaymentGatewaySetting']['live_mode_value'];
			}else if($PaymentGatewayInfo['PaymentGatewaySetting']['key'] == 'secure_pass'){
				$this->secure_pass = $PaymentGatewayInfo['PaymentGatewaySetting']['live_mode_value'];
			}
		}
}
	
	//Hàm xây dựng url, trong đó có tham số mã hóa (còn gọi là public key)
	public function buildCheckoutUrl($return_url, $receiver, $transaction_info, $order_code, $price)
	{
		// Mảng các tham số chuyển tới nganluong.vn
		$arr_param = array(
			'merchant_site_code'=>	strval($this->merchant_site_code),
			'return_url'		=>	strtolower(urlencode($return_url)),
			'receiver'			=>	strval($receiver),
			'transaction_info'	=>	strval($transaction_info),
			'order_code'		=>	strval($order_code),
			'price'				=>	strval($price)					
		);
		$secure_code ='';
		$secure_code = implode(' ', $arr_param) . ' ' . $this->secure_pass;
		$arr_param['secure_code'] = md5($secure_code);
		
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$redirect_url = $this->nganluong_url;
		if (strpos($redirect_url, '?') === false)
		{
			$redirect_url .= '?';
		}
		else if (substr($redirect_url, strlen($redirect_url)-1, 1) != '?' && strpos($redirect_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$redirect_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$url = '';
		foreach ($arr_param as $key=>$value)
		{
			if ($url == '')
				$url .= $key . '=' . $value;
			else
				$url .= '&' . $key . '=' . $value;
		}
		
		return $redirect_url.$url;
	}
	
	/*Hàm thực hiện xác minh tính đúng đắn của các tham số trả về từ nganluong.vn*/
	
	public function verifyPaymentUrl($transaction_info, $order_code, $price, $payment_id, $payment_type, $error_text, $secure_code)
	{
		// Tạo mã xác thực từ chủ web
		$str = '';
		$str .= ' ' . strval($transaction_info);
		$str .= ' ' . strval($order_code);
		$str .= ' ' . strval($price);
		$str .= ' ' . strval($payment_id);
		$str .= ' ' . strval($payment_type);
		$str .= ' ' . strval($error_text);
		$str .= ' ' . strval($this->merchant_site_code);
		$str .= ' ' . strval($this->secure_pass);

        // Mã hóa các tham số
		$verify_secure_code = '';
		$verify_secure_code = md5($str);
		
		// Xác thực mã của chủ web với mã trả về từ nganluong.vn
		if ($verify_secure_code === $secure_code) return true;
		
		return false;
	}
	function checkOrderNganLuong($order_code,$payment_id){
		//include_once('mylibrary.php');
		$param = "<ORDERS>";
		$param .= "<TOTAL>1</TOTAL>";
		$param .= "<ORDER>";
		$param .= "<ORDER_CODE>{$order_code}</ORDER_CODE>";
		$param .= "<PAYMENT_ID>{$payment_id}</PAYMENT_ID>";
		$param .= "</ORDER>";
		$param .= "</ORDERS>";
		$checksum = md5($this->merchant_site_code+$param+$this->secure_pass);
	
		$client = new SoapClient('https://www.nganluong.vn/public_api.php?wsdll');
		$nganLuongReturnDataXML = $client->checkOrder($this->merchant_site_code,$param,$checksum);
		$nganLuongReturnData = simplexml_load_string($nganLuongReturnDataXML);
		$nganLuongReturnData = json_encode($nganLuongReturnData);
		$nganLuongReturnData = json_decode($nganLuongReturnData,TRUE);
		
		$errorCode = $nganLuongReturnData['ERROR_CODE'];
		$transactionErrorCode = $nganLuongReturnData['TRANSACTION']['TRANSACTION_ERROR_CODE'];
		$transactionStatus = $nganLuongReturnData['TRANSACTION']['TRANSACTION_STATUS'];
		$return = array();
		//transaction success
		if($errorCode == 00 && $transactionErrorCode == 00 && ($transactionStatus ==2 || $transactionStatus ==4)){
			$return['status'] = TRUE;
			$return['nganluongXML'] = $nganLuongReturnDataXML;
			$return['transactionStatus'] = $transactionStatus;
		}else{
			//transaction false
			$return['status'] = FALSE;
		}
		return $return;
	}
	
    //It will fetch payment_gateway and payment_gateway_settings and normalize the array in to single array
    function getPaymentSettingsCustom($id = null)
    {
        if (is_null($id)) {
            return false;
        }
        $paymentGateway = $this->query('SELECT `PaymentGatewaySetting`.`key`, `PaymentGatewaySetting`.`live_mode_value`, `PaymentGatewaySetting`.`payment_gateway_id` 
FROM `payment_gateway_settings` AS `PaymentGatewaySetting`   
WHERE `PaymentGatewaySetting`.`payment_gateway_id` = ('.$id.')  ;
        ');
        if (!empty($paymentGateway[0]['PaymentGatewaySetting'])) {
            foreach($paymentGateway as $paymentGatewaySetting) {
                $paymentGateway['PaymentGateway'][$paymentGatewaySetting['PaymentGatewaySetting']['key']] = $paymentGatewaySetting['PaymentGatewaySetting']['value'];
            }
        } else {
            return false;
        }
        unset($paymentGateway['PaymentGatewaySetting']);
        return $paymentGateway;
    }
}
?>
